package com.execdemo.demoeventservice.enumerate;

import lombok.Data;

@Data
public class Result<T> {

    private String type;

    //返回码
    private String code;

    //返回消息
    private String message;

    private String note;

    //返回数据
    private T data;

    public Result(){}

    /**
     * 构建一个包含指定数据的结果对象
     * 此方法用于封装数据到Result对象中，提供统一的数据返回格式
     *
     * @param <T> 泛型参数，表示可以是任意类型
     * @param data 要封装到Result对象中的数据如果数据为null，则Result对象中的数据也将为null
     * @return 返回一个包含指定数据的Result对象
     */
    protected static <T> Result<T> build(T data) {
        // 创建一个Result对象
        Result<T> result = new Result<T>();
        // 如果数据不为null，则将其设置到Result对象中
        if (data != null)
            result.setData(data);
        // 返回包含数据的Result对象
        return result;
    }

    /**
     * 构建一个具有自定义状态码和消息的Result对象
     * 此方法允许通过指定body，code和message来创建一个Result对象，以便于在返回结果时提供更丰富的信息
     *
     * @param body    结果对象的主体内容，可以是任意类型
     * @param code    结果对象的状态码，用于表示执行结果的类型
     * @param message 结果对象的消息，用于提供更详细的执行结果描述
     * @return 返回一个带有指定body，code和message的Result对象
     */
    public static <T> Result<T> build(T body,String type, String code, String message,String note) {
        Result<T> result = build(body);
        result.setType(type);
        result.setCode(code);
        result.setMessage(message);
        result.setNote(note);
        return result;
    }

    /**
     * 构建一个带有特定结果码和消息的Result对象
     * 此方法用于当需要创建一个包含特定业务数据（body）以及特定结果码和消息的Result对象时
     * 通过使用泛型，此方法可以适用于任何类型的业务数据
     *
     * @param body            业务数据，可以是任何类型
     * @param resultCodeEnum  结果码枚举，包含结果码和对应的消息
     * @return                返回一个包含业务数据、结果码和消息的Result对象
     */
    public static <T> Result<T> build(T body, EventEnum resultCodeEnum) {
        // 首先调用build方法创建一个包含业务数据的Result对象
        Result<T> result = build(body);

        // 设置Result对象的结果码和消息，来源于传入的结果码枚举
        result.setType(resultCodeEnum.getType());
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        result.setNote(resultCodeEnum.getNote());

        // 返回构建好的Result对象
        return result;
    }

    public static<T> Result<T> ok(){
        return Result.ok(null);
    }

    /**
     * 操作成功
     * @param data  baseCategory1List
     * @param <T>
     * @return
     */
    public static<T> Result<T> ok(T data){
        Result<T> result = build(data);
        return build(data, EventEnum.SUCCESS);
    }

    public static<T> Result<T> fail(){
        return Result.fail(null);
    }

    /**
     * 操作失败
     * @param data
     * @param <T>
     * @return
     */
    public static<T> Result<T> fail(T data){
        Result<T> result = build(data);
        return build(data, EventEnum.FAIL);
    }

    public Result<T> message(String msg){
        this.setMessage(msg);
        return this;
    }

    public Result<T> code(String code){
        this.setCode(code);
        return this;
    }
}
